/**
 * 通过阻塞IO操作 按键驱动和LED灯驱动，实现按键控制LED灯的功能
 */
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>

#include "mydrv.h"

int fd_key, fd_led, fd_dd;
volatile int led_mode; // led的模式
float dd_value=12.34;

void *key_listen_task(void *args)
{
    int key_num, ret;
    while (ret = read(fd_key, &key_num, 4))
    { // 阻塞式等待
        printf("监测到: 按键[%d]被按下!\n", key_num);
        if (key_num == 1)
        {
            // key1 led1亮
            ioctl(fd_led, LED_ON, 1); // led1亮
        }
        else if (key_num == 2)
        {
            // key2 led2亮
            ioctl(fd_led, LED_ON, 2); // led1亮
        }else if(key_num == 3){ // key3 led1和led2都灭
            ioctl(fd_led, LED_OFF, 1);
            ioctl(fd_led, LED_OFF, 2);
        }else{
            printf("按键[%d]无效!!!!!!!!!!!!!!!!!!!!!!!\n", key_num);
        }
    }
    return NULL;
}

void *key_dd_task(void *args)
{
    while (1)
    {
        ioctl(fd_dd, DD_LED_1_SHOW, 1);
        usleep(25);
        ioctl(fd_dd, DD_LED_22_SHOW, 2);
        usleep(25);
        ioctl(fd_dd, DD_LED_3_SHOW, 3);
        usleep(25);
        ioctl(fd_dd, DD_LED_4_SHOW, 4);
        usleep(25);
    }
    return NULL;
}

int main()
{
    // 按键
    // fd_key = open("/dev/key_drv", O_RDWR);
    // if (fd_key < 0)
    // {
    //     printf("打开[按键]设备失败\n");
    //     return -1;
    // }
    // led灯
    // fd_led = open("/dev/led_drv", O_RDWR);
    // if (fd_led < 0)
    // {
    //     printf("打开[led]设备失败\n");
    //     close(fd_key);
    //     return -1;
    // }
    //数显管
    // fd_dd = open("/dev/dd_drv", O_RDWR);

    //
    // pthread_t tid;
    // pthread_create(&tid, NULL, key_listen_task, NULL);
    // pthread_join(tid, NULL);
    //
    // pthread_create(&tid, NULL, key_dd_task, NULL);
    // pthread_join(tid, NULL);

    //
    // close(fd_key);
    // close(fd_led);
    // close(fd_dd);

    //测试i2c的温湿度传感器
    // int fd = open("/dev/mywd", O_RDONLY);
    // if(fd<0){
    //     printf("打开设备失败\n");
    //     return -1;
    // }
    // while(1){
    //     int temp,hum;
    //     ioctl(fd, WD_GET, &temp);
    //     ioctl(fd, SD_GET, &hum);
    //     printf("温度:[%d][%#X], 湿度:[%d][%#X]\n", temp,temp, hum,hum);
    //     //大小端转换
    //     temp=ntohs(temp);
    //     hum=ntohs(hum);
    //     printf("温度:[%d][%#X], 湿度:[%d][%#X]\n", temp,temp, hum,hum);
        
    //     float t,h;
    //     t=175.72*temp/65536-46.85;
    //     h=125.0*hum/65536 - 6;
    //     printf("温度:[%.2f], 湿度:[%.2f]\n", t, h);
    //     sleep(1);    
    // }

    // close(fd);

    //测试光照传感器
    int fd = open("/dev/mylight", O_RDONLY);
    if(fd<0){
        printf("打开设备失败\n");
        return -1;
    }
    while(1){
        int light;
        ioctl(fd, LIGHT_GET, &light);
        printf("光照强度:[%d]\n", light);
        
        sleep(1);    
    }

    close(fd);

    return 0;
}